<?php

declare(strict_types=1);

namespace Zms\Unit;

/**
 * 目录助手
 */
class Directory
{

    /**
     * 创建目录
     * @param string $dir 目录路径
     * @param int $permissions 目录权限
     * @return bool
     */
    public static function created(string $dir, int $permissions = 0755): bool
    {
        return is_dir($dir) or self::created(dirname($dir)) and mkdir($dir, $permissions);
    }


    /**
     * 遍历目录下的文件
     * @param string $dir 指定的目录
     * @param array $extend 需要的扩展名称
     * @return array 文件列表
     */
    public static function findDirectoryFiles(string $dir, array $extend = []): array
    {
        $files = [];
        $file = scandir($dir);
        foreach ($file as $item) {
            if ($item === '.' || $item === '..') continue;
            if (is_file($dir . '/' . $item)) {
                $ext = File::extendName($item);
                if (count($extend) === 0 || Lists::exists($ext, $extend)) {
                    $files[] = $dir . '/' . $item;
                }
            } elseif (is_dir($dir . '/' . $item)) {
                $files = array_merge($files, self::findDirectoryFiles($dir . '/' . $item, $extend));
            }
        }
        return array_unique($files);
    }


    /**
     * 删除文件夹
     * @param string $dir 要删除的文件夹路径
     * @return bool
     */
    public static function remove(string $dir): bool
    {
        $dh = opendir($dir);
        while ($file = readdir($dh)) {
            if ($file != "." && $file != "..") {
                $path = $dir . "/" . $file;
                if (!is_dir($path)) {
                    unlink($path);
                } else {
                    self::remove($path);
                }
            }
        }
        closedir($dh);
        return rmdir($dir);
    }


    /**
     * 获取目录大小
     * @param string $dir 目录
     * @return int 目录大小
     */
    public static function getSize(string $dir): int
    {
        $sizeResult = 0;
        $handle = opendir($dir);
        while (false !== ($FolderOrFile = readdir($handle))) {
            if ($FolderOrFile != "." && $FolderOrFile != "..") {
                if (is_dir("$dir/$FolderOrFile")) {
                    $sizeResult += self::getSize("$dir/$FolderOrFile");
                } else {
                    $sizeResult += filesize("$dir/$FolderOrFile");
                }
            }
        }
        closedir($handle);
        return $sizeResult;
    }


    /**
     * @describe 判断目录是否存在
     * @user zlf <zms-pro@qq.com> 2025/3/25
     * @param string $dir 目录地址
     * @param bool $created 是否创建目录
     * @return bool
     */
    public static function has(string $dir, bool $created = true): bool
    {
        if (is_dir($dir)) return true;
        if ($created) return self::created($dir);
        return false;
    }
}